home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / Subversive Component Hacks / Flippant / Flippant.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-06-23  |  3.9 KB  |  162 lines

  1. #include <Movies.h>
  2. #include <FixMath.h>
  3.  
  4. #include "Flippant.h"
  5.  
  6. // data structures
  7.  
  8. typedef struct {
  9.     Component victim;
  10. } FlippantSharedGlobalsRecord, **FlippantSharedGlobalsHandle;
  11.  
  12. typedef struct{
  13.     ComponentInstance                    self;
  14.     ComponentInstance                    delegateComponent;
  15.     ComponentInstance                    target;
  16.     FlippantSharedGlobalsHandle            sharedGlobals;
  17.     UInt32                                eventCount;
  18. } FlippantGlobalsRecord, *FlippantGlobalsPtr;
  19.  
  20. // dispatcher
  21.  
  22. #define MC_BASENAME()                     Flippant
  23. #define MC_GLOBALS()                     FlippantGlobalsPtr storage
  24.  
  25. #define CALLCOMPONENT_BASENAME()        MC_BASENAME()
  26. #define    CALLCOMPONENT_GLOBALS()            MC_GLOBALS()
  27.  
  28. #define COMPONENT_UPP_PREFIX()            uppMC
  29. #define COMPONENT_DISPATCH_FILE            "FlippantDispatch.h"
  30. #define COMPONENT_SELECT_PREFIX()          kMC
  31.  
  32. #define    GET_DELEGATE_COMPONENT()        (storage->delegateComponent)
  33.  
  34. #include "Components.k.h"
  35. #include "Movies.k.h"
  36. #include "ComponentDispatchHelper.c"
  37.  
  38. // code
  39.  
  40. pascal ComponentResult FlippantOpen(FlippantGlobalsPtr glob, ComponentInstance self)
  41. {
  42.     ComponentResult err;
  43.     FlippantSharedGlobalsHandle sharedGlobals;
  44.  
  45.     glob = (FlippantGlobalsPtr)NewPtrClear(sizeof(FlippantGlobalsRecord));
  46.     err = MemError();
  47.     if (noErr != err) goto bail;
  48.  
  49.     SetComponentInstanceStorage(self, (Handle)glob);
  50.     glob->self = self;
  51.     glob->target = self;
  52.  
  53.     sharedGlobals = (FlippantSharedGlobalsHandle)GetComponentRefcon((Component)self);
  54.     if (!sharedGlobals) {
  55.         Component victim;
  56.         ComponentDescription cd;
  57.  
  58.         GetComponentInfo((Component)self, &cd, nil, nil, nil);
  59.         cd.componentManufacturer = kVictimManufacturer;
  60.         cd.componentFlags = 0;
  61.         cd.componentFlagsMask = 0;
  62.         victim = FindNextComponent(nil, &cd);
  63.         if (!victim) {
  64.             DebugStr("\p couldn't find victim!");
  65.             err = paramErr;
  66.             goto bail;
  67.         }
  68.  
  69.         sharedGlobals = (FlippantSharedGlobalsHandle) NewHandleSysClear(sizeof(FlippantSharedGlobalsRecord));
  70.         if (!sharedGlobals) {
  71.             err = MemError();
  72.             goto bail;
  73.         }
  74.         SetComponentRefcon((Component)self, (long)sharedGlobals);
  75.  
  76.         victim = CaptureComponent(victim, (Component)self);
  77.         if (!victim) {
  78.             err = paramErr;
  79.             goto bail;
  80.         }
  81.         (**sharedGlobals).victim = victim;
  82.     }
  83.  
  84.     glob->sharedGlobals = sharedGlobals;
  85.     err = OpenAComponent((**sharedGlobals).victim, &glob->delegateComponent);
  86.     if (err) goto bail;
  87.  
  88.     ComponentSetTarget(glob->delegateComponent, self);
  89.  
  90. bail:
  91.     return err;
  92. }
  93.  
  94. pascal ComponentResult FlippantRegister(FlippantGlobalsPtr glob)
  95. {
  96.     // If we get this far, we must have been opened successfully, so all is well.
  97.     return noErr;
  98. }
  99.  
  100. pascal ComponentResult FlippantUnregister(FlippantGlobalsPtr glob)
  101. {
  102.     UncaptureComponent((**glob->sharedGlobals).victim);
  103.     DisposeHandle((Handle)glob->sharedGlobals);
  104.     return noErr;
  105. }
  106.  
  107. pascal ComponentResult FlippantClose(FlippantGlobalsPtr glob, ComponentInstance self)
  108. {
  109.     if (glob) {
  110.         if (glob->delegateComponent)
  111.             CloseComponent(glob->delegateComponent);
  112.  
  113.         DisposePtr((Ptr)glob);
  114.     }
  115.  
  116.     return noErr;
  117. }
  118.  
  119. pascal ComponentResult FlippantTarget(FlippantGlobalsPtr glob, ComponentInstance target)
  120. {
  121.     glob->target = target;
  122.     if (glob->delegateComponent)
  123.         ComponentSetTarget(glob->delegateComponent, target);
  124.  
  125.     return noErr;
  126. }
  127.  
  128. pascal ComponentResult FlippantVersion(FlippantGlobalsPtr glob)
  129. {
  130.     return CallComponentVersion(glob->delegateComponent);
  131. }
  132.  
  133. static Boolean capsLockIsDown(void)
  134. {
  135.     KeyMapByteArray    keys;
  136.     GetKeys((UInt32*)keys);
  137.     return (keys[7] & 2) ? true : false;
  138. }
  139.  
  140. pascal ComponentResult FlippantIsPlayerEvent(FlippantGlobalsPtr glob, const EventRecord *e)
  141. {
  142.     Boolean okayToFlip = (0 == glob->eventCount++); // only do this once
  143.     
  144.     if (okayToFlip) {
  145.         Movie m = MCGetMovie(glob->delegateComponent);
  146.         if (m) {
  147.             MatrixRecord matrix;
  148.             Rect box;
  149.             GetMovieMatrix(m, &matrix);
  150.             GetMovieBox(m, &box);
  151.             
  152.             if (!EmptyRect(&box)) {
  153.                 ScaleMatrix(&matrix, -fixed1, fixed1, (box.right + box.left) * fixed1 / 2, 0);
  154.                 SetMovieMatrix(m, &matrix);
  155.                 ClearMovieChanged(m); // The "Save changes?" dialog gives the game away...
  156.             }
  157.         }
  158.     }
  159.     
  160.     return MCIsPlayerEvent(glob->delegateComponent, e);
  161. }
  162.